package ferran.tomas.ta;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.net.SocketFactory;
import javax.net.ssl.SSLSocket;

import org.jdom.Document;

import android.util.Log;


public class ServidorPrincipal {
	private String ipServer;
	private int port;
	private Document respuestaDocServidorPrincipal;
	private String respuestaServidorPrincipal;
	private Socket s;
	private static ServidorPrincipal instancia;

	private ServidorPrincipal(String ipServidor, int puertoServidorPrincipal) {
		this.ipServer = ipServidor;
		this.port = puertoServidorPrincipal;
		this.s = null;
	}

	private ServidorPrincipal() {
		this.ipServer = "10.0.2.2";
		//this.ipServer = "10.182.39.97"; 
		this.port = 7777;
		this.s = null;
	}

	public static ServidorPrincipal getInstancia() {
		if(instancia == null) instancia = new ServidorPrincipal();

		return instancia;
	}

	public static ServidorPrincipal getInstancia(String ipServidor, int puertoServidorPrincipal) {
		if(instancia == null) instancia = new ServidorPrincipal(ipServidor, puertoServidorPrincipal);

		return instancia;
	}
	
	public Boolean registro(String nombre, String password){
		this.respuestaServidorPrincipal = null;
		SocketFactory socketfactory = SocketFactory.getDefault();
		try {
			this.s = socketfactory.createSocket(this.ipServer, this.port);
		} catch (UnknownHostException ex) {
			ex.printStackTrace();
			this.respuestaServidorPrincipal = ("Conexion Rechazada: Host "+this.ipServer+":"+this.port+" desconocido");
			return false;
		}
		catch (IOException ex) {
			ex.printStackTrace();
			this.respuestaServidorPrincipal = "Conexion Rechazada: Servidor principal caido / no iniciado.";
			return false;
	    }
		
		Document xmlRespuestaServidor = enviaRecibe(utilsXML.XML_registro(nombre, password));
		
		try {
			s.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		if (utilsXML.getXML_type(xmlRespuestaServidor).equals("resRegistro")) {
			Log.i("ServidorPrincipal.conectarServidorPrincipal","Registro exitoso");
			this.respuestaServidorPrincipal = "Registro exitoso";
		}
		
		this.respuestaDocServidorPrincipal = xmlRespuestaServidor;
		return true;
	}

	public Boolean conectarServidorPrincipal(String nombre, String password) {
		try {
			s = new Socket(this.ipServer, this.port);
		} catch (UnknownHostException ex) {
			respuestaServidorPrincipal = ("Conexion Rechazada: Host "+this.ipServer+":"+this.port+" desconocido");
			Log.e("ServidorPrincipal.conectarServidorPrincipal", "Conexion Rechazada: Host "+this.ipServer+":"+this.port+" desconocido");
			ex.printStackTrace();
			return false;
		}
		catch (IOException ex) {
			respuestaServidorPrincipal = "Conexion Rechazada: Servidor principal caido / no iniciado.";
			Log.e("ServidorPrincipal.conectarServidorPrincipal", "Conexion Rechazada: Servidor principal caido / no iniciado.");
			ex.printStackTrace();
			return false;
		}

		Document xmlRespuestaServidor = enviaRecibe(utilsXML.XML_login(nombre, password));	

		try {
			s.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

		if (utilsXML.getXML_type(xmlRespuestaServidor).equals("resLogin")) {
			Log.i("ServidorPrincipal.conectarServidorPrincipal", "Conexion exitosa con el servidor principal");
		}
		this.respuestaDocServidorPrincipal = xmlRespuestaServidor;
		return true;
	}
	public Boolean insertarProducto(String ID, String precio, String rating, String cantidad ) {
		try {
			s = new Socket(this.ipServer, this.port);
		} catch (UnknownHostException ex) {
			respuestaServidorPrincipal = ("Conexion Rechazada: Host "+this.ipServer+":"+this.port+" desconocido");
			Log.e("ServidorPrincipal.conectarServidorPrincipal", "Conexion Rechazada: Host "+this.ipServer+":"+this.port+" desconocido");
			ex.printStackTrace();
			return false;
		}
		catch (IOException ex) {
			respuestaServidorPrincipal = "Conexion Rechazada: Servidor principal caido / no iniciado.";
			Log.e("ServidorPrincipal.conectarServidorPrincipal", "Conexion Rechazada: Servidor principal caido / no iniciado.");
			ex.printStackTrace();
			return false;
		}

		Document xmlRespuestaServidor = enviaRecibe(utilsXML.XML_addproduct(ID, precio, rating, cantidad));	

		try {
			s.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

		if (utilsXML.getXML_type(xmlRespuestaServidor).equals("resLogin")) {
			Log.i("ServidorPrincipal.conectarServidorPrincipal", "Conexion exitosa con el servidor principal");
		}
		this.respuestaDocServidorPrincipal = xmlRespuestaServidor;
		return true;
	}
	
	public Boolean insertarContacto(String username, String contacto) {
		try {
			s = new Socket(this.ipServer, this.port);
		} catch (UnknownHostException ex) {
			respuestaServidorPrincipal = ("Conexion Rechazada: Host "+this.ipServer+":"+this.port+" desconocido");
			Log.e("ServidorPrincipal.conectarServidorPrincipal", "Conexion Rechazada: Host "+this.ipServer+":"+this.port+" desconocido");
			ex.printStackTrace();
			return false;
		}
		catch (IOException ex) {
			respuestaServidorPrincipal = "Conexion Rechazada: Servidor principal caido / no iniciado.";
			Log.e("ServidorPrincipal.conectarServidorPrincipal", "Conexion Rechazada: Servidor principal caido / no iniciado.");
			ex.printStackTrace();
			return false;
		}

		Document xmlRespuestaServidor = enviaRecibe(utilsXML.XML_addcontacts(username, contacto));	

		try {
			s.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

		if (utilsXML.getXML_type(xmlRespuestaServidor).equals("resLogin")) {
			Log.i("ServidorPrincipal.conectarServidorPrincipal", "Conexion exitosa con el servidor principal");
		}
		this.respuestaDocServidorPrincipal = xmlRespuestaServidor;
		return true;
	}
	public Boolean getItinerarios(String xml_getItinerarios) {
		try {
			s = new Socket(this.ipServer, this.port);
		} catch (UnknownHostException ex) {
			respuestaServidorPrincipal = ("Conexion Rechazada: Host "+this.ipServer+":"+this.port+" desconocido");
			Log.e("ServidorPrincipal.conectarServidorPrincipal", "Conexion Rechazada: Host "+this.ipServer+":"+this.port+" desconocido");
			ex.printStackTrace();
			return false;
		}
		catch (IOException ex) {
			respuestaServidorPrincipal = "Conexion Rechazada: Servidor principal caido / no iniciado.";
			Log.e("ServidorPrincipal.conectarServidorPrincipal", "Conexion Rechazada: Servidor principal caido / no iniciado.");
			ex.printStackTrace();
			return false;
		}

		Document xmlRespuestaServidor = enviaRecibe(xml_getItinerarios);	

		try {
			s.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

		if (utilsXML.getXML_type(xmlRespuestaServidor).equals("resItinerario")) {
			Log.i("ServidorPrincipal.conectarServidorPrincipal", "Conexion exitosa con el servidor principal");
		}
		this.respuestaDocServidorPrincipal = xmlRespuestaServidor;
		return true;
	}
	
	public Boolean listarProductos() {
		try {
			s = new Socket(this.ipServer, this.port);
		} catch (UnknownHostException ex) {
			respuestaServidorPrincipal = ("Conexion Rechazada: Host "+this.ipServer+":"+this.port+" desconocido");
			Log.e("ServidorPrincipal.conectarServidorPrincipal", "Conexion Rechazada: Host "+this.ipServer+":"+this.port+" desconocido");
			ex.printStackTrace();
			return false;
		}
		catch (IOException ex) {
			respuestaServidorPrincipal = "Conexion Rechazada: Servidor principal caido / no iniciado.";
			Log.e("ServidorPrincipal.conectarServidorPrincipal", "Conexion Rechazada: Servidor principal caido / no iniciado.");
			ex.printStackTrace();
			return false;
		}

		Document xmlRespuestaServidor = enviaRecibe(utilsXML.XML_listProduct());	
		System.out.println(xmlRespuestaServidor);
		try {
			s.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

		if (utilsXML.getXML_type(xmlRespuestaServidor).equals("resLogin")) {
			Log.i("ServidorPrincipal.conectarServidorPrincipal", "Conexion exitosa con el servidor principal");
		}
		this.respuestaDocServidorPrincipal = xmlRespuestaServidor;
		return true;
	}

	public boolean getCheckpoints(String xml_getCheckpoints) {
		try {
			s = new Socket(this.ipServer, this.port);
		} catch (UnknownHostException ex) {
			respuestaServidorPrincipal = ("Conexion Rechazada: Host "+this.ipServer+":"+this.port+" desconocido");
			Log.e("ServidorPrincipal.conectarServidorPrincipal", "Conexion Rechazada: Host "+this.ipServer+":"+this.port+" desconocido");
			ex.printStackTrace();
			return false;
		}
		catch (IOException ex) {
			respuestaServidorPrincipal = "Conexion Rechazada: Servidor principal caido / no iniciado.";
			Log.e("ServidorPrincipal.conectarServidorPrincipal", "Conexion Rechazada: Servidor principal caido / no iniciado.");
			ex.printStackTrace();
			return false;
		}

		Document xmlRespuestaServidor = enviaRecibe(xml_getCheckpoints);	

		try {
			s.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

		if (utilsXML.getXML_type(xmlRespuestaServidor).equals("resListarCheckpoints")) {
			Log.i("ServidorPrincipal.conectarServidorPrincipal", "Conexion exitosa con el servidor principal");
		}
		this.respuestaDocServidorPrincipal = xmlRespuestaServidor;
		return true;
	}

	private Document enviaRecibe(String xml_login) {
		Log.d("GeoChat","ServidorPrincipal.enviaRecibe :Enviamos \r\n"+xml_login.replace(">", ">\r\n"));

		try {
			BufferedWriter w = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
			w.write(xml_login);
			w.newLine();
			w.flush();
		} catch (IOException e) {
			Log.d("GeoChat", "Error en el envio del archivo al servidor principal");
			e.printStackTrace();
		}
		
		String mensaje = null;
		try {
			BufferedReader r = new BufferedReader( new InputStreamReader(s.getInputStream()));
			mensaje = r.readLine();
		} catch (IOException e) {
			System.out.println("Error al intentar recibir un archivo del servidor principal");
			e.printStackTrace();
		}
		Log.i("GeoChat","ServidorPrincipal.enviaRecibe :Recibimos \r\n"+mensaje/*.replace(">", ">\r\n")*/);
		Document xmlRespuesta = utilsXML.getXML(mensaje);
		if (xmlRespuesta == null) {	
			Log.e("GeoChat","ServidorPrincipal.enviaRecibe :	Servidor loco");
			System.exit(1);
		}
		return xmlRespuesta;
	}
	

	public Document favorito(String xml) {
		SocketFactory socketfactory = SocketFactory.getDefault();
		try {
			this.s = (SSLSocket) socketfactory.createSocket(this.ipServer, this.port);
		} catch (UnknownHostException ex) {
			respuestaServidorPrincipal = ("Conexion Rechazada: Host "+this.ipServer+":"+this.port+" desconocido");
			return null;
		}
		catch (IOException ex) {
			respuestaServidorPrincipal = "Conexion Rechazada: Servidor principal caido / no iniciado.";
			return null;
		}
		return enviaRecibe(xml);
	}
	
	public String getIpServer() { return ipServer; }
	public void setIpServer(String ipServer) { this.ipServer = ipServer; }
	public int getPort() { return port; }
	public void setPort(int port) { this.port = port;}
	public Document getDocRespuestaServidorPrincipal() { return respuestaDocServidorPrincipal; }
	public String getRespuestaServidorPrincipal() {	return respuestaServidorPrincipal; }
	public Socket getS() { return s;}
	
	public void addMessage(Document xml) {
		// TODO Auto-generated method stub
		
	}

	
}
